#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
简化的舆论监控Web面板

提供基本的Web界面进行舆论监控管理。
"""

import asyncio
import sys
import os
from datetime import datetime
from typing import Dict, List

# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from pywebio import start_server
from pywebio import input as pinput
from pywebio.output import put_text, put_html, put_table, put_buttons, put_success, put_error, put_warning, put_info, clear, put_markdown
from pywebio.session import run_async, set_env

from sentiment.analyzer import SentimentAnalyzer
from sentiment.keywords import KeywordManager

class SimpleDashboard:
    """简化的舆论监控面板"""
    
    def __init__(self):
        self.analyzer = SentimentAnalyzer()
        self.keywords = KeywordManager()
    
    async def main_interface(self):
        """主界面"""
        set_env(title='舆论监控系统', output_animation=False)
        
        # 页面标题
        put_html('<h1>🎯 舆论监控系统</h1>')
        put_html('<p>简化版Web界面 - 快速进行舆情分析</p>')
        
        # 导航按钮
        put_buttons([
            {'label': '📊 分析文本', 'value': 'analyze', 'color': 'primary'},
            {'label': '📺 分析视频', 'value': 'video', 'color': 'info'},
            {'label': '🏷️ 关键词管理', 'value': 'keywords', 'color': 'success'},
            {'label': '📈 统计报告', 'value': 'stats', 'color': 'warning'},
        ], onclick=self.handle_navigation)
        
        # 默认显示分析界面
        await self.show_analyze_page()
    
    async def handle_navigation(self, action):
        """处理导航按钮"""
        clear()
        put_html('<h1>🎯 舆论监控系统</h1>')
        
        # 重新显示导航
        put_buttons([
            {'label': '📊 分析文本', 'value': 'analyze', 'color': 'primary'},
            {'label': '📺 分析视频', 'value': 'video', 'color': 'info'},
            {'label': '🏷️ 关键词管理', 'value': 'keywords', 'color': 'success'},
            {'label': '📈 统计报告', 'value': 'stats', 'color': 'warning'},
        ], onclick=self.handle_navigation)
        
        if action == 'analyze':
            await self.show_analyze_page()
        elif action == 'video':
            await self.show_video_page()
        elif action == 'keywords':
            await self.show_keywords_page()
        elif action == 'stats':
            await self.show_stats_page()
    
    async def show_analyze_page(self):
        """显示文本分析页面"""
        put_html('<hr>')
        put_html('<h2>📊 文本情感分析</h2>')
        
        # 输入表单
        data = await pinput.input_group("分析设置", [
            textarea('text', label='要分析的文本', placeholder='请输入评论、反馈或其他文本内容...', rows=5),
            select('analysis_type', label='分析类型', options=[
                {'label': '单条分析', 'value': 'single'},
                {'label': '批量分析', 'value': 'batch'}
            ], value='single')
        ])
        
        if data['text'].strip():
            await self.analyze_text(data['text'], data['analysis_type'])
    
    async def analyze_text(self, text: str, analysis_type: str):
        """分析文本"""
        put_info("🔄 正在分析中...")
        
        try:
            if analysis_type == 'batch':
                # 批量分析 - 按行分割
                lines = [line.strip() for line in text.split('\n') if line.strip()]
                results = []
                
                for i, line in enumerate(lines, 1):
                    result = self.analyzer.analyze_sentiment(line)
                    results.append({
                        '序号': i,
                        '文本': line[:30] + '...' if len(line) > 30 else line,
                        '情感': result['sentiment'],
                        '分数': f"{result['score']:.3f}",
                        '威胁等级': f"{result['threat_level']}/5",
                        '关键词': ', '.join(result['keywords'][:3]) if result['keywords'] else '无'
                    })
                
                # 显示批量结果
                clear()
                put_html('<h2>📊 批量分析结果</h2>')
                put_table(results)
                
                # 统计信息
                positive_count = sum(1 for r in [self.analyzer.analyze_sentiment(line.strip()) for line in text.split('\n') if line.strip()] if r['sentiment'] == 'positive')
                negative_count = sum(1 for r in [self.analyzer.analyze_sentiment(line.strip()) for line in text.split('\n') if line.strip()] if r['sentiment'] == 'negative')
                total = len(lines)
                
                put_html(f'''
                <div style="margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 5px;">
                    <h3>📈 统计结果</h3>
                    <p>总计: {total} 条</p>
                    <p>正面: {positive_count} 条 ({positive_count/total*100:.1f}%)</p>
                    <p>负面: {negative_count} 条 ({negative_count/total*100:.1f}%)</p>
                    <p>中性: {total-positive_count-negative_count} 条 ({(total-positive_count-negative_count)/total*100:.1f}%)</p>
                </div>
                ''')
                
            else:
                # 单条分析
                result = self.analyzer.analyze_sentiment(text)
                
                clear()
                put_html('<h2>📊 文本分析结果</h2>')
                
                # 情感结果
                sentiment_color = 'success' if result['sentiment'] == 'positive' else 'danger' if result['sentiment'] == 'negative' else 'secondary'
                sentiment_emoji = '😊' if result['sentiment'] == 'positive' else '😠' if result['sentiment'] == 'negative' else '😐'
                
                put_html(f'''
                <div style="margin: 20px 0; padding: 20px; border: 2px solid #dee2e6; border-radius: 10px;">
                    <h3>原文本</h3>
                    <p style="font-style: italic; color: #6c757d;">"{text}"</p>
                    
                    <h3>分析结果</h3>
                    <div style="display: flex; gap: 20px; flex-wrap: wrap;">
                        <div style="padding: 10px; background: #e3f2fd; border-radius: 5px;">
                            <strong>情感倾向</strong><br>
                            {sentiment_emoji} {result['sentiment'].upper()}
                        </div>
                        <div style="padding: 10px; background: #f3e5f5; border-radius: 5px;">
                            <strong>情感分数</strong><br>
                            {result['score']:.3f}
                        </div>
                        <div style="padding: 10px; background: #fff3e0; border-radius: 5px;">
                            <strong>威胁等级</strong><br>
                            {result['threat_level']}/5
                        </div>
                        <div style="padding: 10px; background: #e8f5e8; border-radius: 5px;">
                            <strong>置信度</strong><br>
                            {result['confidence']:.3f}
                        </div>
                    </div>
                    
                    {f'<p style="margin-top: 15px;"><strong>关键词:</strong> {", ".join(result["keywords"])}</p>' if result['keywords'] else ''}
                </div>
                ''')
                
        except Exception as e:
            put_error(f"❌ 分析失败: {str(e)}")
        
        # 返回按钮
        put_buttons(['🔙 返回'], onclick=lambda _: run_async(self.show_analyze_page))
    
    async def show_video_page(self):
        """显示视频分析页面"""
        put_html('<hr>')
        put_html('<h2>📺 视频舆情分析</h2>')
        
        put_warning("⚠️ 注意: 视频分析需要配置有效的Cookie才能正常工作")
        put_info("💡 提示: 请查看 cookie-config.md 了解如何配置Cookie")
        
        # 输入表单
        data = await pinput.input_group("视频分析", [
            pinput('video_url', label='视频链接', placeholder='请输入抖音/TikTok视频链接'),
            pinput('target_name', label='监控目标名称', placeholder='可选，便于管理'),
            select('max_comments', label='最大评论数', options=[
                {'label': '50条', 'value': 50},
                {'label': '100条', 'value': 100},
                {'label': '200条', 'value': 200},
                {'label': '500条', 'value': 500}
            ], value=100)
        ])
        
        if data['video_url'].strip():
            put_info("🔄 正在获取视频评论...")
            put_warning("📺 演示模式: 使用模拟数据进行分析")
            
            # 模拟评论数据
            demo_comments = [
                "这个视频拍得真好！",
                "内容很有趣，学到了",
                "支持博主，继续加油",
                "质量不错，值得推荐",
                "很棒的分享，感谢",
                "不太喜欢这个风格",
                "感觉一般般吧",
                "有点无聊了",
                "这什么垃圾内容",
                "太假了，不真实"
            ]
            
            # 分析评论
            results = []
            for comment in demo_comments:
                result = self.analyzer.analyze_sentiment(comment)
                results.append(result)
            
            # 显示结果
            clear()
            put_html('<h2>📺 视频舆情分析结果</h2>')
            put_html(f'<p><strong>视频链接:</strong> {data["video_url"]}</p>')
            put_html(f'<p><strong>目标名称:</strong> {data["target_name"] or "未命名"}</p>')
            
            # 统计
            positive_count = sum(1 for r in results if r['sentiment'] == 'positive')
            negative_count = sum(1 for r in results if r['sentiment'] == 'negative')
            neutral_count = len(results) - positive_count - negative_count
            avg_score = sum(r['score'] for r in results) / len(results)
            
            put_html(f'''
            <div style="display: flex; gap: 15px; margin: 20px 0; flex-wrap: wrap;">
                <div style="padding: 15px; background: #d4edda; border-radius: 8px; text-align: center;">
                    <h3 style="margin: 0; color: #155724;">😊 正面</h3>
                    <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{positive_count}</p>
                    <p style="margin: 0; color: #6c757d;">{positive_count/len(results)*100:.1f}%</p>
                </div>
                <div style="padding: 15px; background: #f8d7da; border-radius: 8px; text-align: center;">
                    <h3 style="margin: 0; color: #721c24;">😠 负面</h3>
                    <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{negative_count}</p>
                    <p style="margin: 0; color: #6c757d;">{negative_count/len(results)*100:.1f}%</p>
                </div>
                <div style="padding: 15px; background: #d1ecf1; border-radius: 8px; text-align: center;">
                    <h3 style="margin: 0; color: #0c5460;">😐 中性</h3>
                    <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{neutral_count}</p>
                    <p style="margin: 0; color: #6c757d;">{neutral_count/len(results)*100:.1f}%</p>
                </div>
                <div style="padding: 15px; background: #fff3cd; border-radius: 8px; text-align: center;">
                    <h3 style="margin: 0; color: #856404;">📊 平均分</h3>
                    <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{avg_score:.3f}</p>
                    <p style="margin: 0; color: #6c757d;">总体情感</p>
                </div>
            </div>
            ''')
            
            # 详细评论列表
            comment_data = []
            for i, (comment, result) in enumerate(zip(demo_comments, results), 1):
                sentiment_emoji = '😊' if result['sentiment'] == 'positive' else '😠' if result['sentiment'] == 'negative' else '😐'
                comment_data.append({
                    '序号': i,
                    '情感': f"{sentiment_emoji} {result['sentiment'].upper()}",
                    '分数': f"{result['score']:.3f}",
                    '威胁': f"{result['threat_level']}/5",
                    '评论内容': comment
                })
            
            put_html('<h3>📝 评论详情</h3>')
            put_table(comment_data)
            
            # 风险评估
            risk_level = "低风险 🟢"
            if negative_count / len(results) > 0.3:
                risk_level = "高风险 🔴"
            elif negative_count / len(results) > 0.15:
                risk_level = "中风险 🟡"
            
            put_html(f'''
            <div style="margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 5px;">
                <h3>🚨 风险评估</h3>
                <p><strong>舆情风险等级:</strong> {risk_level}</p>
                <p><strong>建议:</strong> {'需要密切关注负面评论，及时回应用户关切' if '高风险' in risk_level else '保持监控，注意舆情变化' if '中风险' in risk_level else '舆情状态良好，继续保持'}</p>
            </div>
            ''')
            
            put_buttons(['🔙 返回'], onclick=lambda _: run_async(self.show_video_page))
    
    async def show_keywords_page(self):
        """显示关键词管理页面"""
        put_html('<hr>')
        put_html('<h2>🏷️ 关键词管理</h2>')
        
        # 获取关键词统计
        negative_words = self.keywords.get_negative_keywords()
        positive_words = self.keywords.get_positive_keywords()
        monitor_words = self.keywords.get_monitor_keywords()
        
        put_html(f'''
        <div style="display: flex; gap: 15px; margin: 20px 0; flex-wrap: wrap;">
            <div style="padding: 15px; background: #f8d7da; border-radius: 8px; text-align: center;">
                <h3 style="margin: 0;">🔍 负面关键词</h3>
                <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{len(negative_words)}</p>
            </div>
            <div style="padding: 15px; background: #d4edda; border-radius: 8px; text-align: center;">
                <h3 style="margin: 0;">😊 正面关键词</h3>
                <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{len(positive_words)}</p>
            </div>
            <div style="padding: 15px; background: #d1ecf1; border-radius: 8px; text-align: center;">
                <h3 style="margin: 0;">📌 监控关键词</h3>
                <p style="margin: 5px 0; font-size: 24px; font-weight: bold;">{len(monitor_words)}</p>
            </div>
        </div>
        ''')
        
        # 显示示例关键词
        if negative_words:
            put_html('<h3>🔍 负面关键词示例</h3>')
            put_html('<p>' + ', '.join(negative_words[:20]) + '</p>')
        
        if positive_words:
            put_html('<h3>😊 正面关键词示例</h3>')
            put_html('<p>' + ', '.join(positive_words[:20]) + '</p>')
        
        if monitor_words:
            put_html('<h3>📌 监控关键词</h3>')
            put_html('<p>' + ', '.join(monitor_words) + '</p>')
        
        # 添加关键词表单
        put_html('<h3>➕ 添加新关键词</h3>')
        data = await pinput.input_group("添加关键词", [
            pinput('keyword', label='关键词', placeholder='输入要添加的关键词'),
            select('category', label='类别', options=[
                {'label': '监控关键词', 'value': 'monitor'},
                {'label': '负面关键词', 'value': 'negative'},
            ])
        ])
        
        if data['keyword'].strip():
            try:
                if data['category'] == 'monitor':
                    success = self.keywords.add_monitor_keyword(data['keyword'])
                    if success:
                        put_success(f"✅ 成功添加监控关键词: {data['keyword']}")
                    else:
                        put_warning(f"⚠️ 关键词已存在: {data['keyword']}")
                elif data['category'] == 'negative':
                    success = self.keywords.add_negative_keyword(data['keyword'])
                    if success:
                        put_success(f"✅ 成功添加负面关键词: {data['keyword']}")
                    else:
                        put_warning(f"⚠️ 关键词已存在: {data['keyword']}")
                        
                put_buttons(['🔄 刷新页面'], onclick=lambda _: run_async(self.show_keywords_page))
                
            except Exception as e:
                put_error(f"❌ 添加失败: {str(e)}")
    
    async def show_stats_page(self):
        """显示统计报告页面"""
        put_html('<hr>')
        put_html('<h2>📈 统计报告</h2>')
        
        put_info("📊 这里将显示历史分析统计数据")
        
        # 模拟统计数据
        put_html(f'''
        <div style="margin: 20px 0;">
            <h3>📊 今日统计</h3>
            <div style="display: flex; gap: 15px; flex-wrap: wrap;">
                <div style="padding: 15px; background: #e3f2fd; border-radius: 8px;">
                    <h4>分析次数</h4>
                    <p style="font-size: 24px; font-weight: bold; margin: 0;">0</p>
                </div>
                <div style="padding: 15px; background: #f3e5f5; border-radius: 8px;">
                    <h4>监控目标</h4>
                    <p style="font-size: 24px; font-weight: bold; margin: 0;">0</p>
                </div>
                <div style="padding: 15px; background: #fff3e0; border-radius: 8px;">
                    <h4>告警数量</h4>
                    <p style="font-size: 24px; font-weight: bold; margin: 0;">0</p>
                </div>
            </div>
        </div>
        
        <div style="margin: 20px 0;">
            <h3>🏷️ 关键词统计</h3>
            <p>负面关键词: {len(self.keywords.get_negative_keywords())} 个</p>
            <p>正面关键词: {len(self.keywords.get_positive_keywords())} 个</p>
            <p>监控关键词: {len(self.keywords.get_monitor_keywords())} 个</p>
        </div>
        
        <div style="margin: 20px 0;">
            <h3>💡 使用建议</h3>
            <ul>
                <li>定期更新关键词库以提高分析准确性</li>
                <li>关注负面评论比例，及时处理舆情风险</li>
                <li>配置Cookie以使用完整的视频监控功能</li>
                <li>设置告警规则以及时响应舆情变化</li>
            </ul>
        </div>
        ''')

def start_dashboard(port=8083, debug=True):
    """启动Web面板"""
    print("🎯 舆论监控系统启动中...")
    print(f"📱 Web面板地址: http://localhost:{port}")
    print(f"🔧 调试模式: {'开启' if debug else '关闭'}")
    
    dashboard = SimpleDashboard()
    
    start_server(dashboard.main_interface, port=port, debug=debug)

if __name__ == "__main__":
    start_dashboard(port=8084, debug=True)